#!/bin/bash

# =============================================================================
# 堆内存转储分析脚本
# 用途：使用Eclipse MAT工具分析Java堆内存转储文件，检测内存泄漏问题
# 作者：性能调优团队
# 使用方法：./analyze_heap_dump.sh <heap_dump_file>
# 示例：./analyze_heap_dump.sh java_pid32384.hprof
# =============================================================================

# 检查是否提供了堆转储文件参数
if [ $# -eq 0 ]; then
    echo "用法: $0 <heap_dump_file>"
    echo "示例: $0 java_pid32384.hprof"
    exit 1
fi

# 获取第一个参数作为堆转储文件名
HEAP_DUMP_FILE="$1"

# 检查文件是否存在
if [ ! -f "$HEAP_DUMP_FILE" ]; then
    echo "错误: 文件 '$HEAP_DUMP_FILE' 不存在"
    exit 1
fi

echo "开始分析堆转储文件: $HEAP_DUMP_FILE"

# 调用ParseHeapDump.sh工具执行MAT分析
echo "开始执行堆内存分析..."
# 分析内容包含九个重要维度：
# - suspects: 内存泄漏嫌疑对象，自动识别潜在的内存泄漏
# - overview: 堆内存概览，提供堆内存的整体分布情况
# - top_components: 占用内存最多的组件，找出内存消耗大户
# - histogram: 直方图，按类分组的对象统计，快速识别占用内存最多的类
# - dominator_tree: 支配树，对象引用关系树，帮助理解内存占用结构
# - leak_hunter: 泄漏猎人，专门的内存泄漏检测，比suspects更深入
# - thread_overview: 线程概览，线程相关的内存分析，识别线程泄漏
# - duplicate_classes: 重复类，检测类加载器问题，识别重复的类定义
# - retained_set: 保留集，分析对象的保留内存，更准确的内存占用评估
ParseHeapDump.sh "$HEAP_DUMP_FILE" \
    org.eclipse.mat.api:suspects \
    org.eclipse.mat.api:overview \
    org.eclipse.mat.api:top_components \
    org.eclipse.mat.api:histogram \
    org.eclipse.mat.api:dominator_tree \
    org.eclipse.mat.api:leak_hunter \
    org.eclipse.mat.api:thread_overview \
    org.eclipse.mat.api:duplicate_classes \
    org.eclipse.mat.api:retained_set

echo "堆转储分析完成" 